﻿using App.Interface;
using AutoMapper;
using Domain.Entidades;
using PagedList;

using SiteCredivale.ViewModels;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Services;
using tipos_documentos = Domain.Entidades.tipos_documentos;
using System.Web.Script.Serialization;

namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class DocumentosController : Controller
    {
        // GET: /Intranet/Documentos/

        private readonly IUsuarioAppService _usuarioapp;
        private readonly IDocumentosAppService _documentosapp;

        public DocumentosController()
        {
        }

        public DocumentosController(IUsuarioAppService usuarioapp, IDocumentosAppService documentosapp)
        {
            _usuarioapp = usuarioapp;
            _documentosapp = documentosapp;
        }

        [Authorize]
        public ActionResult Arquivos(string arq)
        {
            FtpWebRequest objFTP = null;
            try
            {
                documento documentos = _documentosapp.carrega_busca(int.Parse(arq));

                if (documentos != null)

                {
                    objFTP = Generica.FTPDetail(documentos.doc_codigo + documentos.doc_extensao);
                    objFTP.Method = WebRequestMethods.Ftp.DownloadFile;

                    FtpWebResponse response = (FtpWebResponse)objFTP.GetResponse();

                    return File(response.GetResponseStream(), "application/pdf", documentos.doc_desc + documentos.doc_extensao);
                }
                else
                {
                    TempData["arquivo_inexistente"] = "A";
                    return Redirect("/Intranet_/Inicio/Sessao");
                }
            }
            catch (Exception ex)
            {
                TempData["arquivo_inexistente"] = "A";
                return Redirect("/Intranet_/Inicio/Sessao");
            }
        }


        [Authorize]
        public ActionResult Listar(int? page, string calendario1, string calendario2, string tipo, string origem, string tip, string returnUrl, string desc)
        {
            try
            {
                DateTime teste;
                DateTime? data2;
                DateTime? data1;



                if (returnUrl == null)
                {
                    returnUrl = Server.UrlDecode(Request.UrlReferrer.PathAndQuery);

                }

                if (tip == null)
                {
                    return Redirect(returnUrl);

                }

                int numero;

                try
                {
                    int.TryParse(tip, out numero);
                }
                catch (Exception ex)
                {

                    return Redirect(returnUrl);
                }


                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(numero);

                if (tipo_origem == null)
                {
                    return Redirect(returnUrl);

                }


                if (DateTime.TryParse(calendario1, out teste) == false)
                {
                    data1 = null;
                }
                else
                {
                    data1 = teste;
                }
                if (DateTime.TryParse(calendario2, out teste) == false)
                {
                   data2 = null;
                }
                else
                {
                    data2 = teste;
                }


                List<tipos_documentos> tipos = _documentosapp.busca_tipos(int.Parse(origem ?? "-1"));
                tipos.Add(new tipos_documentos { tip_codigo = -1, tip_descricao = "[Qualquer]" } );
            
                if (tipo == "" || tipo == null || tipo == "-1")
                {
               
                    ViewBag.tipo = new SelectList(tipos, "tip_codigo","tip_descricao",-1);
                    ViewBag.tipo_escolhido = -1;
                }
                else
                {
                     ViewBag.tipo = new SelectList(tipos, "tip_codigo", "tip_descricao",int.Parse(tipo));
                    ViewBag.tipo_escolhido = int.Parse(tipo);

                }

                ViewBag.ori_escolhida = origem;
                ViewBag.desc = desc;
                ViewBag.tip = tip;
                ViewBag.titulo = tipo_origem.tip_descricao;

                List<origem_documentos> origens = _documentosapp.busca_origens(tipo_origem.tip_codigo);
                origem_documentos qualquer = new origem_documentos();
                qualquer.ori_codigo = -1;
                qualquer.ori_descricao = "[Qualquer]";
                qualquer.tip_codigo = tipo_origem.tip_codigo;
                origens.Add(qualquer);




                if (origem == null)
                {


                    ViewBag.origem = new SelectList(origens, "ori_codigo", "ori_descricao", -1);

                }

                else
                {
                    ViewBag.origem = new SelectList(origens, "ori_codigo", "ori_descricao", int.Parse(origem));
                }



                const int pageSize = 10;
                var pagedavisos = _documentosapp.Listar(data1, data2,  tipo, origem ?? "-1", _usuarioapp.GetUsuarioLogado(0), desc ?? "",tipo_origem.tip_codigo).ToPagedList(page ?? 1, pageSize);
                return View(pagedavisos);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        [Authorize]
        public ActionResult Manutencao(int? page, string tipo, string origem,string tip, string returnUrl,string desc)
        {
            try
            {

                if (_usuarioapp.verifica_permissao(2110) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }


                if (returnUrl == null)
                {
                    returnUrl = Server.UrlDecode(Request.UrlReferrer.PathAndQuery);

                }

                if (tip == null)
                {
                    return Redirect(returnUrl);

                }

                int numero;

                try
                {
                    int.TryParse(tip, out numero);
                }
                catch (Exception ex)
                {

                    return Redirect(returnUrl);
                }


                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(numero);

                if (tipo_origem == null)
                {
                    return Redirect(returnUrl);

                }

                List<tipos_documentos> tipos = _documentosapp.busca_tipos(int.Parse(origem ?? "-1"));
                tipos.Add(new tipos_documentos { tip_codigo = -1, tip_descricao = "[Qualquer]" });

                if (tipo == "" || tipo == null || tipo == "-1")
                {

                    ViewBag.tipo = new SelectList(tipos, "tip_codigo", "tip_descricao", -1);
                    ViewBag.tipo_escolhido = -1;
                }
                else
                {
                    ViewBag.tipo = new SelectList(tipos, "tip_codigo", "tip_descricao", int.Parse(tipo));
                    ViewBag.tipo_escolhido = int.Parse(tipo);

                }

                ViewBag.ori_escolhida = origem;
                ViewBag.desc = desc;
                ViewBag.tip = tip;
                ViewBag.titulo = tipo_origem.tip_descricao;

                List<origem_documentos> origens = _documentosapp.busca_origens(tipo_origem.tip_codigo);
                origem_documentos qualquer = new origem_documentos();
                qualquer.ori_codigo = -1;
                qualquer.ori_descricao = "[Qualquer]";
                qualquer.tip_codigo = tipo_origem.tip_codigo;
                origens.Add(qualquer);




                if (origem == null)
                {

              
                ViewBag.origem = new SelectList(origens,"ori_codigo","ori_descricao",-1);

                }

                else
                {
                    ViewBag.origem = new SelectList(origens, "ori_codigo", "ori_descricao",int.Parse(origem));
                }

                const int pageSize = 10;
                var pagedavisos = _documentosapp.Listar(null, null, tipo, origem ?? "-1", null, desc ?? "", tipo_origem.tip_codigo).ToPagedList(page ?? 1, pageSize);
                return View("Manutencao", pagedavisos);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [Authorize, HttpPost]
        public ActionResult Manutencao(string tipo, string origem, string tip, string desc)
        {
            try
            {
                List<tipos_documentos> tipos = _documentosapp.busca_tipos(int.Parse(origem ?? "-1"));
                tipos.Add(new tipos_documentos { tip_codigo = -1, tip_descricao = "[Qualquer]" });

                if (tipo == "" || tipo == null || tipo == "-1")
                {

                    ViewBag.tipo = new SelectList(tipos, "tip_codigo", "tip_descricao", -1);
                    ViewBag.tipo_escolhido = -1;
                }
                else
                {
                    ViewBag.tipo = new SelectList(tipos, "tip_codigo", "tip_descricao", int.Parse(tipo));
                    ViewBag.tipo_escolhido = int.Parse(tipo);

                }

                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(int.Parse(tip));
                ViewBag.ori_escolhida = origem;
                ViewBag.desc = desc;
                ViewBag.tip = tip;
                ViewBag.titulo = tipo_origem.tip_descricao;


                List<origem_documentos> origens = _documentosapp.busca_origens(int.Parse(tip));
                origem_documentos qualquer = new origem_documentos();
                qualquer.ori_codigo = -1;
                qualquer.ori_descricao = "[Qualquer]";
                qualquer.tip_codigo = int.Parse(tip);
                origens.Add(qualquer);

                ViewBag.origem = new SelectList(origens, "ori_codigo", "ori_descricao", int.Parse(origem));

                const int pageSize = 10;
                var pagedavisos = _documentosapp.Listar(null, null, tipo, origem ?? "-1", null,desc ?? "", tipo_origem.tip_codigo).ToPagedList(1, pageSize);
                return View(pagedavisos);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [Authorize]
        public ActionResult Inserir(string returnUrl,string tipo)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(2102) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Aviso");
                }


                if (returnUrl == null)
                {
                    returnUrl = Server.UrlDecode(Request.UrlReferrer.PathAndQuery);

                }

                if (tipo == null)
                {
                    
                   Redirect(returnUrl);

                }

                int numero =0;

                try
                {
                    int.TryParse(tipo, out numero);
                }
                catch (Exception ex)
                {

                  Redirect(returnUrl);
                }


                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(numero);

                if (tipo_origem == null)
                {
                    return Redirect(returnUrl);

                }


                ViewBag.titulo = tipo_origem.tip_descricao;
                IEnumerable<origem_documentos> origens = _documentosapp.busca_origens(tipo_origem.tip_codigo).ToList();
                ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(origens.First().ori_codigo),"tip_codigo","tip_descricao");
                ViewBag.ori_codigo = new SelectList(origens,"ori_codigo","ori_descricao"); 
                ViewBag.arvore =  new JavaScriptSerializer().Serialize(GetTreeData(null));

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return View();
        }

        [Authorize]
        public ActionResult Editar(int codigo)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(2103) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Documentos");
                }

                documento documento = _documentosapp.carrega_busca(codigo);
                ViewBag.titulo = documento.tipos_documentos.origem_documentos.tipos_origem_documentos.tip_descricao;
                documento.tipo = documento.tipos_documentos.origem_documentos.tip_codigo;
                ViewBag.ori_codigo = new SelectList(_documentosapp.busca_origens(documento.tipos_documentos.origem_documentos.tip_codigo), "ori_codigo", "ori_descricao", documento.tipos_documentos.ori_codigo);
                ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.tipos_documentos.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);


                documento.enviar_email = false;

                return View(Mapper.Map<documento, documentosViewModel>(documento));
            }
            catch (Exception ex)
            {

             
                throw ex;
            }
        }


        [HttpPost, Authorize, ValidateInput(false)]
        public ActionResult Editar(documentosViewModel documento)
        {
            try
            {

                ViewBag.titulo = _documentosapp.busca_tipo_origens(documento.tipo).tip_descricao;



                if (documento.flag == "1")
                {
                    if (documento.arquivo == null)
                    {
                        ModelState.AddModelError("arquivo", "Selecione o arquivo");
                    }
                    if (documento.arquivo.ContentLength > 100000000)
                    {
                        ModelState.AddModelError("arquivo", "O arquivo é muito grande e não pode ser inserido");
                    }
                }
                if (ModelState.IsValid)
                {
                    _documentosapp.Editar(Mapper.Map<documentosViewModel, documento>(documento));

                    documento = Mapper.Map<documento, documentosViewModel>(_documentosapp.carrega_busca(documento.doc_codigo));
                    documento.flag = "0";
                    ViewBag.res = "Documento alterado com sucesso !";

                    ViewBag.ori_codigo = new SelectList(_documentosapp.busca_origens(documento.tipos_documentos.origem_documentos.tip_codigo), "ori_codigo", "ori_descricao", documento.tipos_documentos.ori_codigo);
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.tipos_documentos.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);
                    return View(documento);

                }


                ViewBag.ori_codigo = new SelectList(_documentosapp.busca_origens(documento.tipo), "ori_codigo", "ori_descricao", documento.ori_codigo);
                ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);
                
                return View(documento);

            }
            catch (Exception ex)
            {

                documento = Mapper.Map<documento, documentosViewModel>(_documentosapp.carrega_busca(documento.doc_codigo));
              
               

                if (ex.Message.Substring(0, 5) == "email")
                {

                    ViewBag.ori_codigo = new SelectList(_documentosapp.busca_origens(documento.tipos_documentos.origem_documentos.tip_codigo), "ori_codigo", "ori_descricao", documento.tipos_documentos.ori_codigo);
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.tipos_documentos.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);
                    ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));

                    documento.flag = "0";
                    ViewBag.res = "Documento alterado com sucesso, mas não foi possível enviar email para todos os envolvidos, pelo seguinte erro" + "<br /><br />" + ex.Message.Substring(5, ex.Message.Length - 5);
                    ModelState.Clear();
                }
                else
                {

                    ViewBag.ori_codigo = new SelectList(_documentosapp.busca_origens(documento.tipo), "ori_codigo", "ori_descricao", documento.ori_codigo);
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);
                    ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));
                    ViewBag.err = "Erro ao alterar o documento : " + ex.Message + ",contate o administrador";
                }

                return View(documento);
            }
        }

        [HttpGet]
        public ActionResult Gettipos()
        {
            try
            {
                return Json(_documentosapp.Gettipos(int.Parse(Request.QueryString.Get("ori"))), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao recuperar os tipos: " + ex.Message + ", contate o administrador";
                throw ex;
            }
        }

        [HttpPost, Authorize, ValidateInput(false)]
        public ActionResult Inserir(documentosViewModel documento)
        {


            tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(documento.tipo);
            IEnumerable<origem_documentos> origens = _documentosapp.busca_origens(documento.tipo).ToList();
            try
            {

                ViewBag.titulo = tipo_origem.tip_descricao;

                if (string.IsNullOrEmpty(documento.jsusuarios))
                {
                    ModelState.AddModelError("jsusuarios", "Escolha ao menos um usuário");
                }

                if (documento.arquivo == null)
                {
                    ModelState.AddModelError("arquivo", "Selecione o arquivo");
                }
                if (documento.arquivo.ContentLength > 100000000)
                {
                    ModelState.AddModelError("arquivo", "O arquivo é muito grande e não pode ser inserido");
                }

                if (ModelState.IsValid)
                {


                    _documentosapp.Inserir(Mapper.Map<documentosViewModel, documento>(documento));
                    ViewBag.res = "Documento inserido com sucesso !";
                    documento = null;

                    ViewBag.ori_codigo = new SelectList(origens, "ori_codigo", "ori_descricao");
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(origens.First().ori_codigo), "tip_codigo", "tip_descricao");
                    ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(null));
                    return View(documento);

                }


                ViewBag.ori_codigo = new SelectList(origens, "ori_codigo", "ori_descricao", documento.ori_codigo);
                ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.ori_codigo), "tip_codigo", "tip_descricao", documento.doc_tipo);
                ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));
                return View(documento);
            }
            catch (Exception ex)
            {
                if (ex.Message.Substring(0, 5) == "email")
                {

                    documento = null;

                    ViewBag.ori_codigo = new SelectList(origens, "ori_codigo", "ori_descricao");
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(origens.First().ori_codigo), "tip_codigo", "tip_descricao");
                    ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(null));
                    ViewBag.res = "Documento inserido com sucesso, mas não foi possível enviar email para todos os envolvidos, pelo seguinte erro" + "<br /><br />" + ex.Message.Substring(5, ex.Message.Length - 5);
                }
                else
                {
                    ViewBag.err = "Erro ao inserir o documento: " + ex.Message + ", contate o administrador";
                    ViewBag.ori_codigo = new SelectList(origens, "ori_codigo", "ori_descricao",documento.ori_codigo);
                    ViewBag.doc_tipo = new SelectList(_documentosapp.busca_tipos(documento.ori_codigo), "tip_codigo", "tip_descricao",documento.doc_tipo);
                    ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));

                }
                return View(documento);
            }
        }

        [HttpPost, Authorize]
        public ActionResult Deletar(string codigo, string tipo, string origem, string pagina ,string tip, string desc)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(2105) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Documentos");
                }

                _documentosapp.deletar(int.Parse(codigo));
                return RedirectToAction("Manutencao", "Documentos", new { page = int.Parse(pagina), tipo = tipo, origem = origem, tip = tip, desc = desc});
            }
            catch (Exception ex)
            {
                TempData["msg_err"] = "Erro ao deletar o documento: " + ex.Message + ",contate o administrador";
                return RedirectToAction("Manutencao", "Documentos", new { page = int.Parse(pagina), tipo = tipo, origem = origem,tip= tip, desc = desc });
            }
        }
        private List<JsTreeModel> GetTreeData(List<usuario_documento> usuarios_ativos)
        {
            try
            {

         
            IEnumerable<VW_unidade> unidades = _usuarioapp.busca_unidades(0);
           IEnumerable<VW_usuarios> usuarios = _usuarioapp.Listar("", 0, "");
            IEnumerable<VW_setor> setores = _usuarioapp.busca_setores();
             var email = _usuarioapp.busca_email(30, -1, -1).Select(x => x.usu_codigo).ToList();

                usuarios = (from u in usuarios where email.Contains(u.usu_codigo) select u).ToList();

                List < JsTreeModel > todos = new List<JsTreeModel>();
            JsTreeModel children = new JsTreeModel { data = "Todos", attr = new JsTreeAttribute { id = "todos" },children= new List<JsTreeModel>() };
            

            foreach (VW_unidade uni in unidades)
            {



                JsTreeModel ch = new JsTreeModel { data = uni.uni_descricao, attr = new JsTreeAttribute { id = "0" },children = new List<JsTreeModel>()};

                    if (uni.uni_codigo == 5000)
                    {
                        foreach (VW_setor set in setores.Where(x => x.set_codigo != 11))
                        {
                            JsTreeModel ch_setores = new JsTreeModel { data = set.set_descricao, attr = new JsTreeAttribute { id = "0" }, children = new List<JsTreeModel>() };
                            foreach (VW_usuarios usu in usuarios.Where(x => x.set_codigo == set.set_codigo))
                            {
                                JsTreeModel ch_usuarios;
                                if (usuarios_ativos != null)
                                {
                                    ch_usuarios = new JsTreeModel { data = usu.usu_nome, attr = new JsTreeAttribute { id = usu.usu_codigo.ToString(), selected = verifica_arvore(usuarios_ativos, usu.usu_codigo) } };
                                }
                                else
                                {
                                     ch_usuarios = new JsTreeModel { data = usu.usu_nome, attr = new JsTreeAttribute { id = usu.usu_codigo.ToString() } };
                                }

                                ch_setores.children.Add(ch_usuarios);

                            }

                            ch.children.Add(ch_setores);
                        }

                    }
                    else
                    { 
              
                foreach (VW_usuarios usu in usuarios.Where(x => x.uni_codigo == uni.uni_codigo))
                {

                            JsTreeModel ch_usuarios;
                            if (usuarios_ativos != null)
                            {
                                ch_usuarios = new JsTreeModel { data = usu.usu_nome, attr = new JsTreeAttribute { id = usu.usu_codigo.ToString(), selected = verifica_arvore(usuarios_ativos, usu.usu_codigo) } };
                            }
                            else
                            {
                                ch_usuarios = new JsTreeModel { data = usu.usu_nome, attr = new JsTreeAttribute { id = usu.usu_codigo.ToString() } };
                            }
                         ch.children.Add(ch_usuarios);

                }
               }
                    children.children.Add(ch);
                  

                }
                todos.Add(children);
            return todos;

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }
        private bool verifica_arvore(List<usuario_documento> usuarios_ativos,int user)
        {
            try
            {
           
                bool resultado=false;

                foreach (usuario_documento u in usuarios_ativos)
                {
                    if (u.usu_codigo == user)
                    {
                        resultado=true;

                    }

                }

                return resultado;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        [Authorize]
        public ActionResult Liberar_revogar(int codigo)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(5367) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Documentos");
                }

                documento documento = _documentosapp.carrega_busca(codigo);
                ViewBag.titulo = documento.tipos_documentos.origem_documentos.tipos_origem_documentos.tip_descricao;
                ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));


                return View(Mapper.Map<documento, documentosViewModel>(documento));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        [Authorize,HttpPost]
        public ActionResult Liberar_revogar(documentosViewModel doc)
        {
            try
            {


                if (string.IsNullOrEmpty(doc.jsusuarios))
                {
                    ModelState.AddModelError("jsusuarios", "Escolha ao menos um usuário");
                }


                

                _documentosapp.liberar_revogar(Mapper.Map<documentosViewModel, documento>(doc));
                ViewBag.res = "Liberado/Revogado com sucesso !";

                documento documento = _documentosapp.carrega_busca(doc.doc_codigo);
                ViewBag.titulo = documento.tipos_documentos.origem_documentos.tipos_origem_documentos.tip_descricao;
                ViewBag.arvore = new JavaScriptSerializer().Serialize(GetTreeData(documento.usuario_documento.ToList()));
                
                return View(Mapper.Map<documento, documentosViewModel>(documento));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        [Authorize]
        public ActionResult Copiar_perfil(string returnUrl, string tipo)
        {
            try
            {
                if (_usuarioapp.verifica_permissao(5369) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Documentos");
                }


                if (returnUrl == null)
                {
                    returnUrl = Server.UrlDecode(Request.UrlReferrer.PathAndQuery);

                }

                if (tipo == null)
                {

                    Redirect(returnUrl);

                }

                int numero = 0;

                try
                {
                    int.TryParse(tipo, out numero);
                }
                catch (Exception ex)
                {

                    Redirect(returnUrl);
                }


                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(numero);

                if (tipo_origem == null)
                {
                    return Redirect(returnUrl);

                }


                ViewBag.tipo = tipo;
                ViewBag.uni_ori_codigo = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao",5000);
                ViewBag.uni_dest_codigo = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", 5000);
                ViewBag.titulo = tipo_origem.tip_descricao;
                return View();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        [Authorize,HttpPost]
        public ActionResult Copiar_perfil(FormCollection form)
        {
            try
            {

                int user_ori = int.Parse(form["user_ori_codigo"]);
                int user_dest = int.Parse(form["user_dest_codigo"]);



                tipos_origem_documentos tipo_origem = _documentosapp.busca_tipo_origens(int.Parse(form["tipo"]));

          
                ViewBag.uni_ori_codigo = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", 5000);
                ViewBag.uni_dest_codigo = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", 5000);
                ViewBag.titulo = tipo_origem.tip_descricao;

                if (user_ori == user_dest)
                {
                    ViewBag.err = "O usuário de origem não pode ser o mesmo que o de destino.";
                    return View();
                }


                _documentosapp.copiar_perfil(user_ori, user_dest);
                ViewBag.res = "Perfil copiado com sucesso !";


                return View();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        [HttpGet]
        public ActionResult GetUsuario()

        { 

            try
            {

                var listausuarios = _usuarioapp.Listar("uni", int.Parse(Request.QueryString.Get("unidade")), "").Select(x => new { id = x.usu_codigo, desc = x.usu_nome + " - " + x.usu_login });
                var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                string sJSON = oSerializer.Serialize(listausuarios.ToList());
                return Json(sJSON,JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao buscar usuário:" + "\r" + ex.Message + ", contate o administrador";
                throw ex;
            }

        }


    }
}